package com.example.springboot.common;


/**
 * 功能：

 * 日期：2024/3/30 15:25
 */

public class CoreMath {
//
//    /**
//     * 计算指定用户与其他用户之间的相似度或距离
//     *
//     * @param key  要计算相似度或距离的用户ID
//     * @param map  包含用户及其对应产品评分列表的映射
//     * @param type 相似度或距离的计算类型（1：基于用户推荐，0：基于物品推荐）
//     * @return 与指定用户的相似度或距离映射关系
//     */
//    public static Map<Integer, Double> computeNeighbor(Integer key, Map<Integer, List<ProductScore>> map, int type) {
//        Map<Integer, Double> distMap = new TreeMap<>();
//        List<ProductScore> userItems = map.get(key);
//        map.forEach((k, v) -> {
//            //排除此用户
//            if (!k.equals(key)) {
//                //关系系数
//                double coefficient = relateDist(v, userItems, type);
//                //关系距离
//                //   double distance=Math.abs(coefficient);
//                distMap.put(k, coefficient);
//            }
//        });
//        return distMap;
//    }
//
//
//    /**
//     * 计算两个列表中元素的相关系数或距离
//     *
//     * @param xList 第一个产品评分列表
//     * @param yList 第二个产品评分列表
//     * @param type  计算类型，0表示根据产品ID计算，1表示根据用户ID计算
//     * @return 计算得到的相关系数或距离值
//     */
//    private static double relateDist(List<ProductScore> xList, List<ProductScore> yList, int type) {
//        List<Double> xs = Lists.newArrayList();
//        List<Double> ys = Lists.newArrayList();
//        xList.forEach(x -> {
//            yList.forEach(y -> {
//                if (type == 0) {
//                    if (x.getProductId().equals(y.getProductId())) {
//                        xs.add(Double.valueOf(x.getScore()));
//                        ys.add(Double.valueOf(y.getScore()));
//                    }
//                } else {
//                    if (x.getUserId().equals(y.getUserId())) {
//                        xs.add(Double.valueOf(x.getScore()));
//                        ys.add(Double.valueOf(y.getScore()));
//                    }
//                }
//            });
//        });
//        return getRelate(xs, ys);
//    }
//
//    /**
//     * 方法描述: 皮尔森（pearson）相关系数计算
//     *
//     * @param xs x集合
//     * @param ys y集合
//     */
//
//
//    public static double getRelate(List<Double> xs, List<Double> ys) {
//        int n = xs.size();
//        //至少有两个元素
//        if (n < 2) {
//            return 0D;
//        }
//        double Ex = xs.stream().mapToDouble(x -> x).sum();
//        double Ey = ys.stream().mapToDouble(y -> y).sum();
//        double Ex2 = xs.stream().mapToDouble(x -> Math.pow(x, 2)).sum();
//        double Ey2 = ys.stream().mapToDouble(y -> Math.pow(y, 2)).sum();
//        double Exy = IntStream.range(0, n).mapToDouble(i -> xs.get(i) * ys.get(i)).sum();
//        double numerator = Exy - Ex * Ey / n;
//        double denominator = Math.sqrt((Ex2 - Math.pow(Ex, 2) / n) * (Ey2 - Math.pow(Ey, 2) / n));
//        if (denominator == 0) {
//            return 0D;
//        }
//        return numerator / denominator;
//    }


}
